/**
 * 
 */
package gwtool.gui.dataSetTable;

import gwtool.container.DataSet;
import gwtool.container.DataSetItem;
import gwtool.container.Gruppe;
import gwtool.container.PruefungAnzeigen;
import gwtool.gui.MainController;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.swing.ComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.table.DefaultTableModel;

/**
 * @author Christian
 * 
 */
public class DataSetTabelModel extends DefaultTableModel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 9152194714304741490L;

	private List<DataSet> gefilterteListe = new ArrayList<>();

	private DataSetTableController controller;

	public DataSetTabelModel(DataSetTableController dataSetTableController) {

		super();
		controller = dataSetTableController;
	}

	/**
	 * @param col
	 *            gibt die Klasse der Spalte zurück
	 * @return Class
	 */
	@Override
	@SuppressWarnings("unchecked")
	public Class getColumnClass(int col) {

		switch (col) {
		case 0:
			return DataSet.class;
		case 1:
			return String.class;
		case 2:
			return PruefungAnzeigen.class;
		default:
			return null;
		}
	}

	/**
	 * @return Anzahl der Zeilen
	 */
	@Override
	public int getRowCount() {

		if (gefilterteListe == null) {
			return 0;
		}
		return gefilterteListe.size();
	}

	/**
	 * @return Anzahl der Spalten
	 */
	@Override
	public int getColumnCount() {

		return 3;
	}

	/**
	 * @param column
	 *            SpaltenId
	 * @return Name der Spalte
	 */
	@Override
	public String getColumnName(int column) {

		switch (column) {
		case 0:
			return "Bezeichner";
		case 1:
			return "Einsatzstatus";
		case 2:
			return "Nächste Prüfung";
		default:
			throw new IllegalArgumentException("Zu viele Spalten");
		}
	}

	/**
	 * Neu filtern und die Tabelle neu zeichnen
	 */
	public void aktualisiere() {

		filtern();
		fireTableDataChanged();
	}

	/**
	 * Filtert die HeldenListe
	 */
	private void filtern() {

		gefilterteListe.clear();
		// fill list
		List<DataSet> list = MainController.getInstance().getDataController().getDataSetList();
		List<Gruppe> gruppen = MainController.getInstance().getDataController().getBenutzter().getGruppen();
		for (DataSet set : list) {
			DataSetItem item = set.getAktuellesDataItem();
			// Gruppenrechte prüfen
			boolean leseRechteVorhanden = false;
			for (Gruppe g : gruppen) {
				if (g.getId() == set.getGruppe()) {
					leseRechteVorhanden = true;
					break;
				}
			}
			if (!leseRechteVorhanden) {
				continue;
			}
			if (set.isDeleted()) {
				continue;
			}
			if (controller.getPanel().getFilterTextField() != null) {
				String text = controller.getPanel().getFilterTextField().getText().toLowerCase().trim();
				if (!text.equals("")) {
					if (!item.getFullTextFilterString().toLowerCase().contains(text)) {
						continue;
					}
				}
				if (controller.getPanel().getTypeComboBox() != null) {
					ComboBoxModel<JCheckBox> model = controller.getPanel().getTypeComboBox().getModel();
					boolean show = true;
					for (int i = 0; i < model.getSize(); i++) {
						JCheckBox box = model.getElementAt(i);
						if (set.getAktuellesDataItem().printType().equals(box.getText())) {
							show = box.isSelected();
							break;
						}
					}
					if (!show) {
						continue;
					}
				}
				Gruppe gruppe = (Gruppe) controller.getPanel().getGruppenComboBox().getSelectedItem();
				if (!gruppe.getBezeichner().equals("Alle")) {
					if (set.getGruppe() != gruppe.getId()) {
						continue;
					}
				}
			}
			Collections.sort(gefilterteListe);
			gefilterteListe.add(set);
		}
	}

	/**
	 * @param rowIndex
	 *            Reihe
	 * @param columnIndex
	 *            SpaltenIndex
	 * @return Wert im Feld
	 */
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {

		DataSet set;
		synchronized (gefilterteListe) {
			set = gefilterteListe.get(rowIndex);
		}
		if (set != null) {
			switch (columnIndex) {
			case 0:
				return set;
			case 1:
				return set.getAktuellesDataItem().getStatus();
			case 2:
				return set.getAktuellesDataItem().getNaestePruefungen();
			default:
				throw new IllegalArgumentException("Zu viele Zeilen");
			}
		}
		return null;
	}

	/**
	 * @param rowIndex
	 *            Zeile
	 * @param columnIndex
	 *            Spalte
	 * @return true wenn das Feld veränderbar ist.
	 */
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {

		return false;
	}
}
